package com.juli.school.utils.core.runtime;

public final class ProductContextHolder {
	
	private static ThreadLocal<ProductContext> context = new ThreadLocal<ProductContext>() {
		public ProductContext initialValue() {
			return new ProductContext();
		}
	};
	
	private static ThreadLocal<Long> SERVICE_INIT_COUNT = new ThreadLocal<Long>() {
		public Long initialValue() {
			return 0L;
		}
	};
	
	public static void start() {
		SERVICE_INIT_COUNT.set(SERVICE_INIT_COUNT.get() + 1);
	}
	
	/**
	 * @Description: 清空当前线程产品环境
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年5月24日 下午4:12:39
	 */
	public static void clean() {
		if (null != SERVICE_INIT_COUNT.get()) {
			SERVICE_INIT_COUNT.set(SERVICE_INIT_COUNT.get() - 1L);
		}
		if (null != SERVICE_INIT_COUNT.get() && SERVICE_INIT_COUNT.get().longValue() <= 0) {
			SERVICE_INIT_COUNT.set(0L);
			if (null != context.get()) {
				context.set(null);
			}
		}
	}
	
	/**
	 * @Description: 获取现有产品环境
	 * @return ProductContext 返回类型
	 * @author gaoxiang
	 * @date 2016年5月24日 下午4:12:23
	 */
	public static ProductContext getProductContext() {
		if (null == context.get()) {
			context.set(new ProductContext());
		}
		return context.get();
	}
	
	/**
	 * @Description: 强制覆盖现有的产品环境
	 * @param productContext
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年5月24日 下午4:12:08
	 */
	public static void setProductContext(ProductContext productContext) {
		context.set(productContext);
	}
}
